package com.dingding.javabasic.HashCode计算方法;

import org.junit.jupiter.api.Test;

public class Solution {

    /**
     * 测试hash函数
     *  * 一个好的hash函数应该具备的条件
     *  * 一致性：Hash函数可以接受任意大小的数据，并输出固定长度的hash值
     *  * 雪崩效应：原始数据哪怕只有一个字节的修改，得到的hash值都会发生巨大变化
     *  * 单向性：只能从原始数据计算得到hash值，不能从hash值计算得到原始数据
     *  * 避免冲突：几乎不可能找到一个数据和当前计算的这个数据计算出一样的hash值，理想的hash函数能准确保证数据的唯一性
     */
    @Test
    public void test1(){
        Solution s = new Solution();
        s.hashCode();
        String a = "test";
        String b = "test";
        byte[] bytes = a.getBytes();
        System.out.println(hashCode(bytes));
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
//        System.out.println(a.equals(b));
//        System.out.println(2<<3);712347347 712526093
    }

    /**
     * 测试String
     */
    @Test
    public void test2() {
        //在堆中创建了一个“abc”的字符串对象
        //返回字符串常量池中对“abc”的引用
        String a = "abc";
        //这里new String 还是用的同一个堆里面的“abc”的字符串对象
        //
        String b = new String("abc");
        System.out.println(a==b);
    }

    /**
     *
     * @param value
     * @return
     */
    public static int hashCode(byte[] value) {
        int h = 0;
        for (byte v : value) {
            h = 31 * h + (v & 0xff);
        }
        return h;
    }
}

